package club.jdiy.core.base;

import club.jdiy.core.base.domain.DBEntity;
import club.jdiy.core.ex.JDiyException;

/**
 * Service层超级接口.
 *
 * @param <T>    指明实体类
 * @param <TDao> 指明实体DAO类
 * @param <PK>   指明实体主键类型
 * @author ziquee(子秋) QQ号:39886616 主页: http://www.jdiy.club
 * @version 20200519
 */
public interface JDiyService<T extends DBEntity<PK>, TDao extends JDiyDao<T,PK>, PK> extends JpaDyn<T, PK> {
    /**
     * 用于后台管理（通用的业务数据保存）.
     * 此方法需要开发者去重写实现，才可以被调用，否则将抛出JDiy异常。<br/>
     * <strong>警告：</strong>在任何情况下，开发者都不应该在方法内部直接用 dao.save(vo)保存，
     * 因传入的{@link T}参数可能是非持久化的临时对象(属性值不全)，直接更新可能导致相关字段值丢失！！！
     *
     * @param t 非持久化的vo对象。
     * @return T 持久化T
     */
    default T logicSave(T t) {
        throw new JDiyException("业务保存代码需要开发者实现......");
    }
}
